/***
 * @Description: 本文件将主要是实现网络接口协议的相关功能结构设计和数据结构定义的头文件
 * @Author: Liverpool
 * @Date: 2024-04-22 01:32:17
 * @LastEditTime: 2024-04-23 01:26:36
 * @LastEditors: Liverpool
 */

#ifndef _NET_INTERFACE_H
#define _NET_INTERFACE_H

#include "config.h"
#include "netComman.h"
#include "ipaddr.h"
#include "list.h"
#include "memory_block.h"
#include "fix_queue.h"
#include "debug.h"
#include "packet.h"

// 定义网络地址的硬件地址(mac地址)
typedef struct _Net_Interface_HWaddr
{
    uint8_t address[D_Net_Interfaces_HWaddr_Size];
    uint8_t len;
} D_Net_Interface_HWaddr;

typedef enum _Net_Interfaces_type
{
    Net_Interface_None = 0,
    NET_Interface_ETHER = 1, // 以太网
    NET_Interface_LOOP = 2,  // 回环网卡
    NET_Interface_SIZE,      // 表示有多少种网卡类型(无意义)
} D_Net_Interface_Type;

struct _Net_Interface;
// 定义网络接口的相关硬件操作
typedef struct _Net_Interface_operation
{
    net_err_t (*open)(struct _Net_Interface *netif, void *data); // 打开网卡
    void (*close)(struct _Net_Interface *netif);                 // 关闭网卡
    net_err_t (*transmit)(struct _Net_Interface *netif);         // 发送数据包
} D_Net_Interface_operation;

struct _Net_Interface;
// 根据网卡的类型来选择链路层的回调函数,暴露给工作线程的数据链路层回调函数
typedef struct _link_layer
{
    D_Net_Interface_Type type;                                                      // 输出网络接口对应的数据链路层的类型
    net_err_t (*open)(struct _Net_Interface *netif);                                // 数据链路层的打开
    void (*close)(struct _Net_Interface *netif);                                    // 数据链路层的关闭
    net_err_t (*in)(struct _Net_Interface *netif, D_Packet *buf);                   // 数据链路层的处理输入
    net_err_t (*out)(struct _Net_Interface *netif, D_IP_ADDR *dest, D_Packet *buf); // 数据链路层的处理输出
} D_Link_Layer;
// 定义网络接口结构体(描述网络接口)
typedef struct _Net_Interface
{
    char name[Net_Interface_Name_Size]; // 定义网络接口的名称
    D_Net_Interface_HWaddr hwaddr;      // 网络接口的硬件地址
    D_IP_ADDR ipaddr;                   // 网络接口的IP地址
    D_IP_ADDR netmask;                  // 网络接口的掩码
    D_IP_ADDR gateway;                  // 网络接口的网关
    D_Net_Interface_Type type;          // 网络接口类型
    int mtu;                            // 网络接口单次最大传输数据量
    enum                                // 网络接口的状态
    {
        NET_Interface_Closed = 0,
        NET_Interface_Open = 1,
        NET_Interface_Active = 2,
    } state;
    const D_Net_Interface_operation *operation; // 定义硬件操作结构体指向指针
    void *operation_data;                       // 硬件操作的数据区指针
    const D_Link_Layer *link_layer;             // 数据链路层

    D_ListNode node;                        // 网络接口的节点(和其他网络接口链接)
    D_FixQueue in_queue;                    // 输入队列
    void *in_queue_buf[NET_InQueue_Size];   // 输入队列的数据存储指针缓存区
    D_FixQueue out_queue;                   // 输出队列
    void *out_queue_buf[NET_OutQueue_Size]; // 输出队列的数据存储指针缓存区
} D_Net_Interface;

// 网络接口操作
net_err_t net_interface_init(void);                                                                                          // 对网络接口进行初始化
D_Net_Interface *net_interface_open(const char *dev_name, const D_Net_Interface_operation *operation, void *operation_data); // 网络接口的打开
net_err_t net_interface_close(D_Net_Interface *netif);                                                                       // 关闭网络接口
net_err_t net_interface_set_addr(D_Net_Interface *netif, D_IP_ADDR *ip, D_IP_ADDR *netmask, D_IP_ADDR *gateway);             // 网络接口设置IP地址相关内容
net_err_t net_interface_set_HWaddr(D_Net_Interface *netif, const char *hwaddr, int len);                                     // 网络接口设置硬件地址
net_err_t net_interface_set_active(D_Net_Interface *netif);                                                                  // 激活网络接口
net_err_t net_interface_set_deactive(D_Net_Interface *netif);                                                                // 不激活网络接口
void net_interface_set_default(D_Net_Interface *netif);                                                                      // 设置缺省网络接口
D_Net_Interface *net_interface_get_default(void);                                                                            // 得到默认的网络接口
// 网络接口数据包操作
net_err_t
net_interface_put_in(D_Net_Interface *netif, D_Packet *buf, int ms);                   // 协议栈网卡的输入队列写入
D_Packet *net_interface_get_in(D_Net_Interface *netif, int ms);                        // 协议栈网卡的输入队列读取
net_err_t net_interface_put_out(D_Net_Interface *netif, D_Packet *buf, int ms);        // 协议栈网卡的输出队列写入
D_Packet *net_interface_get_out(D_Net_Interface *netif, int ms);                       // 协议栈网卡的输出队列读取
net_err_t net_interface_out(D_Net_Interface *netif, D_IP_ADDR *ipaddr, D_Packet *buf); // 网卡向外发送数据包
// 网络接口数据链路层相关操作
net_err_t net_interface_register_layer(int type, const D_Link_Layer *layer); // 网络接口数据链路层注册函数
#endif